package com.teacher.game.framework.util;

/**
 * 粒子对象池 - 管理粒子对象的重用
 * 减少频繁的粒子创建和销毁，提升性能
 */
public class ParticlePool extends ObjectPool<Particle> {
    
    private static ParticlePool instance;
    
    /**
     * 私有构造函数，实现单例模式
     * @param maxPoolSize 最大池容量
     */
    private ParticlePool(int maxPoolSize) {
        super(maxPoolSize);
    }
    
    /**
     * 获取粒子池单例实例
     * @return 粒子池实例
     */
    public static ParticlePool getInstance() {
        if (instance == null) {
            instance = new ParticlePool(200); // 最多缓存200个粒子
            instance.preFill(50); // 预创建50个粒子
        }
        return instance;
    }
    
    /**
     * 创建新粒子对象
     * @return 新的粒子对象
     */
    @Override
    protected Particle createObject() {
        return new Particle();
    }
    
    /**
     * 重置粒子对象状态
     * @param particle 要重置的粒子
     */
    @Override
    protected void resetObject(Particle particle) {
        particle.reset();
    }
    
    /**
     * 创建并配置粒子
     * @param x 初始X坐标
     * @param y 初始Y坐标
     * @param velX X方向速度
     * @param velY Y方向速度
     * @param life 生命周期
     * @param color 颜色
     * @param size 大小
     * @return 配置好的粒子对象
     */
    public Particle createParticle(float x, float y, float velX, float velY, 
                                 float life, int color, float size) {
        Particle particle = acquire();
        particle.init(x, y, velX, velY, life, color, size);
        return particle;
    }
    
    /**
     * 回收粒子（当粒子生命周期结束时调用）
     * @param particle 要回收的粒子
     */
    public void recycleParticle(Particle particle) {
        release(particle);
    }
    
    /**
     * 检查池是否需要优化
     * @return 是否需要优化
     */
    public boolean needsOptimization() {
        return getActiveCount() > getMaxSize() * 0.8f; // 超过80%使用率时需要优化
    }
    
    /**
     * 优化对象池
     */
    public void optimizePool() {
        // 清理超出最大容量的对象
        while (getPoolSize() > getMaxSize()) {
            poll(); // 移除多余的对象
        }
    }
    
    /**
     * 获取池统计信息
     * @return 统计信息字符串
     */
    public String getStatistics() {
        return String.format("Pool[Active: %d, Available: %d, Total: %d, Max: %d]",
                getActiveCount(), getPoolSize(), getTotalCount(), getMaxSize());
    }
    
    /**
     * 紧急回收 - 强制回收所有活跃粒子
     */
    public void emergencyRecycle() {
        // 由父类的clear()方法处理
        clear();
    }
    
    /**
     * 获取效率比率
     * @return 效率比率 (0.0-1.0)
     */
    public float getEfficiencyRatio() {
        int total = getTotalCount();
        if (total == 0) return 1.0f;
        return (float) getPoolSize() / total;
    }
}